package com.scofd.signature;

import java.util.List;
import java.util.Map;

public class SignatureJNI {

    /**
     * 初始化
     *
     * @param licence 授权码
     * @return 成功或失败
     */
    public native boolean initialize(String licence);

    /**
     * 销毁
     */
    public native void finalize();

    /**
     * 设置瑞术版签服务配置信息
     *
     * @param rsSignatureConfigJsonJStr 瑞术版签服务配置信息，json格式，例如{"SignatureServerAddress":"http://114.115.214.104:803/gateway/sdk/v1/api/execute", "AppId":"a4908929d8884c5fabbcc04aab2378c3", "AppSecret":"03f5b2ad4505455195efde9aa16116a5", "ProjectKey":"1686623213271908352"}
     */
    public native void setRSSignatureConfig(String rsSignatureConfigJsonJStr);

    /**
     * 注册OES动态库
     *
     * @param oesDllFilePath  OES动态库文件路径
     * @param oesProviderInfo OES提供者信息
     * @return 成功或失败
     */
    public native boolean registerOES(String oesDllFilePath, OESProviderInfo oesProviderInfo);

    /**
     * 解注册OES动态库
     *
     * @param oesDllFilePath OES动态库文件路径
     * @return 成功或失败
     */
    public native boolean unregisterOES(String oesDllFilePath);

    /**
     * 获取印章列表
     *
     * @param oesDllFilePath OES动态库文件路径
     * @param puchPIN        密码
     * @param puchAuthCode   授权码
     * @return 印章列表
     */
    public native List<SealInfo> getSealList(String oesDllFilePath, String puchPIN, String puchAuthCode);

    /**
     * 获取证书用户列表
     *
     * @param oesDllFilePath OES动态库文件路径
     * @return 证书用户列表
     */
    public native List<String> getCertUserList(String oesDllFilePath);

    /**
     * 登录
     *
     * @param oesDllFilePath OES动态库文件路径
     * @param puchPIN        PIN码或会话ID
     * @return 成功或失败
     */
    public native boolean login(String oesDllFilePath, String puchPIN);

    /**
     * 签章
     *
     * @param oesDllFilePath OES动态库文件路径
     * @param signatureArgs  签章参数
     * @return 签章任务ID
     */
    public native String signature(String oesDllFilePath, SignatureArgs signatureArgs);

    /**
     * 获取签名原文，主要用于PDF文件
     *
     * @param oesDllFilePath  OES动态库文件路径
     * @param pdfFilePath     源PDF文件路径
     * @param signMethod      签名算法
     * @param digestMethod    摘要算法
     * @param pdfFilePassword PDF文件密码
     * @return 签名原文base64字符串
     */
    public native String getSignOriginalData(String oesDllFilePath, String pdfFilePath, String signMethod, String digestMethod, String pdfFilePassword);

    /**
     * 获取签名原文，主要用于PDF文件
     *
     * @param signatureTaskId
     * @return
     */
    public native String getSignatureOriginalData(String signatureTaskId);

    /**
     * 获取签章进度
     *
     * @param signatureTaskId 签章任务ID
     * @return 签章进度
     */
    public native int getSignatureProgress(String signatureTaskId);

    /**
     * 获取签章状态
     *
     * @param signatureTaskId 签章任务ID
     * @return 签章状态
     */
    public native int getSignatureStatus(String signatureTaskId);

    /**
     * 获取签章错误信息
     *
     * @param signatureTaskId 签章任务ID
     * @return 签章错误信息
     */
    public native String getSignatureErrMsg(String signatureTaskId);

    /**
     * 保存签章OFD文件
     *
     * @param signatureTaskId 签章任务ID
     * @return 成功或失败
     */
    public native boolean saveSignatureOFD(String signatureTaskId);

    /**
     * 获取签章后OFD文件数据
     *
     * @param signatureTaskId 签章任务ID
     * @return 签章后OFD文件数据
     */
    public native byte[] getSignatureOFDData(String signatureTaskId);

    /**
     * 获取签章后的OFD相关文件数据
     *
     * @param signatureTaskId 签章任务ID
     * @return 签章相关文件数据列表
     */
    public native List<OriginalData> getSignatureDataList(String signatureTaskId);

    /**
     * 获取签章位置信息，比如骑缝章、关键字签章等
     *
     * @param signatureTaskId 签章任务ID
     * @return 签章位置信息数组
     */
    public native List<SignaturePosArgs> getSignaturePosInfoList(String signatureTaskId);

    /**
     * 获取签章数据相对OFD文件路径
     *
     * @param signatureTaskId 签章任务ID
     * @return 获取签章数据相对OFD文件路径
     */
    public native String getSignValuePath(String signatureTaskId);

    /**
     * 获取证书数据
     *
     * @param oesDllFilePath OES动态库文件路径
     * @param puchCertId     证书ID，即会话ID或用户名
     * @return 签章者证书数据
     */
    public native byte[] getCertData(String oesDllFilePath, String puchCertId);

    /**
     * 销毁签章任务
     *
     * @param signatureTaskId 签章任务ID
     * @return 成功或失败
     */
    public native boolean destroySignatureTask(String signatureTaskId);

    /**
     * 获取机器码
     *
     * @return 机器码
     */
    public native String getMachineCode();

    /**
     * 坐标定位盖章
     *
     * @param srcFilePath         输入文件路径
     * @param destFilePath        输出文件路径
     * @param filePassword        文件密码，可为空
     * @param serverSignatureArgs 签章参数
     * @return 返回成功或失败
     */
    public native boolean signByPage(String srcFilePath, String destFilePath, String filePassword,
                                     ServerSignatureArgs serverSignatureArgs);

    /**
     * 跨文件坐标定位批量盖章
     *
     * @param srcFilePathList     输入文件路径列表
     * @param destFilePathList    输出文件路径列表
     * @param filePasswordList    文件密码列表，可为空
     * @param serverSignatureArgs 签章参数
     * @return 返回成功或失败
     */
    public native boolean batchSignByPage(List<String> srcFilePathList, List<String> destFilePathList, List<String> filePasswordList,
                                          ServerSignatureArgs serverSignatureArgs);

    /**
     * 关键字定位盖章
     *
     * @param srcFilePath         输入文件路径
     * @param destFilePath        输出文件路径
     * @param filePassword        文件密码，可为空
     * @param keywords            关键字
     * @param serverSignatureArgs 签章参数
     * @return 返回成功或失败
     */
    public native boolean signByText(String srcFilePath, String destFilePath, String filePassword, String keywords,
                                     ServerSignatureArgs serverSignatureArgs);

    /**
     * 跨文件关键字定位批量盖章
     *
     * @param srcFilePathList     输入文件路径列表
     * @param destFilePathList    输出文件路径列表
     * @param filePasswordList    文件密码列表，可为空
     * @param keywords            关键字
     * @param serverSignatureArgs 签章参数
     * @return 返回成功或失败
     */
    public native boolean batchSignByText(List<String> srcFilePathList, List<String> destFilePathList, List<String> filePasswordList,
                                          String keywords, ServerSignatureArgs serverSignatureArgs);

    /**
     * 删除指定文件的最后一个印章
     *
     * @param srcFilePath  输入文件路径
     * @param destFilePath 输出文件路径
     * @param filePassword 文件密码，可为空
     * @return 返回成功或失败
     */
    public native boolean delSeal(String srcFilePath, String destFilePath, String filePassword);

    /**
     * 删除指定文件的指定名称的印章
     *
     * @param srcFilePath    输入文件路径
     * @param destFilePath   输出文件路径
     * @param signatureName  数字签名唯一名称
     * @param certBase64Data 证书数据base64，前端从oes库中获取到的
     * @param filePassword   文件密码，可为空
     * @return 返回删除的签名域名称列表
     */
    public native List<String> delSealByName(String srcFilePath, String destFilePath, String signatureName, String certBase64Data, String filePassword);

    /**
     * 删除指定文件的指定名称的印章
     *
     * @param oesDllFilePath OES动态库文件路径
     * @param srcFilePath    输入文件路径
     * @param destFilePath   输出文件路径
     * @param signatureName  数字签名唯一名称
     * @param sessionId      意愿认证会话ID
     * @param filePassword   文件密码，可为空
     * @return 返回删除的签名域名称列表
     */
    public native List<String> delIntentionAuthSealByName(String oesDllFilePath, String srcFilePath, String destFilePath, String signatureName, String sessionId, String filePassword);

    /**
     * 删除指定文件的所有印章
     *
     * @param srcFilePath  输入文件路径
     * @param destFilePath 输出文件路径
     * @param filePassword 文件密码，可为空
     * @return 返回成功或失败
     */
    public native boolean delAllSeal(String srcFilePath, String destFilePath, String filePassword);

    /**
     * 撤章验证，用于OFD撤章
     *
     * @param oesDllFilePath OES动态库文件路径
     * @param signatureData  签章数据
     * @param sessionId      意愿认证会话ID
     * @return 成功或失败
     */
    public native boolean cancelSealVerify(String oesDllFilePath, byte[] signatureData, String sessionId);

    /**
     * 跨文件批量删除每个文件的最后一个印章
     *
     * @param srcFilePathList  输入文件路径列表
     * @param destFilePathList 输出文件路径列表
     * @param filePasswordList 文件密码列表，可为空
     * @return 返回成功或失败
     */
    public native boolean batchDelSeal(List<String> srcFilePathList, List<String> destFilePathList, List<String> filePasswordList);

    /**
     * 跨文件批量删除每个文件的所有印章
     *
     * @param srcFilePathList  输入文件路径列表
     * @param destFilePathList 输出文件路径列表
     * @param filePasswordList 文件密码列表，可为空
     * @return 返回成功或失败
     */
    public native boolean batchDelAllSeal(List<String> srcFilePathList, List<String> destFilePathList, List<String> filePasswordList);

    /**
     * 骑缝章
     *
     * @param srcFilePath         输入文件路径接口
     * @param destFilePath        输出文件路径
     * @param filePassword        文件密码，可为空
     * @param serverSignatureArgs 签章参数
     * @return 返回成功或失败
     */
    public native boolean signByQFZ(String srcFilePath, String destFilePath, String filePassword,
                                    ServerSignatureArgs serverSignatureArgs);

    /**
     * 验章
     *
     * @param srcFilePath   输入文件路径
     * @param signatureName 数字签名唯一名称
     * @param filePassword  文件密码，可为空
     * @return 返回成功或失败
     */
    public native boolean verifySignature(String srcFilePath, String signatureName, String filePassword);

    /**
     * 获取签名要保护的原文及本次签名相关信息结构xml
     *
     * @param signatureArgs 签章参数
     * @return 签名要保护的原文及本次签名相关信息结构xml数据
     */
    public native String getSignatureSignedInfoXML(SignatureArgs signatureArgs);

    /**
     * 摘要数据
     *
     * @param digestMethod 摘要方法
     * @param originalData 原文数据
     * @return 摘要后的base64数据
     */
    public native String digest(String digestMethod, byte[] originalData);

    /**
     * 设置摘要线程数
     *
     * @param digestFileThreadNum 摘要线程数
     */
    public native void setDigestFileThreadNum(int digestFileThreadNum);

}
